package co.gov.medellin.ssti.sub.model.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import co.gov.medellin.ssti.sub.model.dao.ISedeDAO;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.vo.SedeVO;
import co.gov.medellin.ssti.sub.model.vo.UsuarioxSedeVO;

public class SedeDAOImpl extends BaseDAOImpl implements ISedeDAO {

	private static final String SELECT_TODAS_SEDES = "SELECT codigo, upper(nombre) nombre from TCS_BEN_SEDE ORDER BY NOMBRE";

	public SedeDAOImpl(Connection con) {
		super(con);
	}

	/**
	 * 
	 * @return
	 */
	public List<SedeVO> loadAllSedes() throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		List<SedeVO> sedes = new ArrayList<SedeVO>();

		try {
			pstmt = conn.prepareStatement(SELECT_TODAS_SEDES);
			rst = pstmt.executeQuery();
			while (rst.next()) {
				SedeVO sede = new SedeVO();
				sede.setCodeSede(new Long(rst.getLong("codigo")));
				sede.setNombre(rst.getString("nombre"));
				sedes.add(sede);
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return sedes;
	}

	public Collection<SedeVO> findSedes(String nombre) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		boolean hasParameters = false;
		StringBuffer query = new StringBuffer(
				"SELECT codigo,nombre FROM TCS_BEN_SEDE ");
		if (!"".equals(nombre)) {
			query.append(" WHERE nombre like UPPER(?) ");
			hasParameters = true;
		}
		ArrayList<SedeVO> sedes = new ArrayList<SedeVO>();
		try {
			pstmt = conn.prepareStatement(query.toString());
			if (hasParameters) {
				pstmt.setString(1, "%" + nombre.trim() + "%");
			}
			rst = pstmt.executeQuery();

			while (rst.next()) {
				SedeVO sede = new SedeVO();
				sede.setCode(new Long(rst.getString("codigo")));
				sede.setNombre(rst.getString("nombre"));
				sedes.add(sede);
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return sedes;
	}

	public Collection<SedeVO> findTotalSedebyUser(Long codeUser,
			Long codeSubpro, String groupUserName, Long areaUser)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		StringBuffer query = new StringBuffer(
				"SELECT distinct CODIGO, NOMBRE,CARACTER,DIRECCION_DESCRIPTIVA, "
						+ " DESDE_VIGENCIA,HASTA_VIGENCIA, VIGENCIA,CODNUCLEO, "
						+ " DESCNUCLEO, SEDE_CODIGO , DESCRIPCION, TIPO,DIRECCION_ENCASILLADA, "
						+ " LOCALIZACION_COBAMA,CODMUNI,DESCMUNI from VCS_BEN_SEDES ");

		List<Object> parameters = new ArrayList<Object>();

		if ((Object) codeUser != null && !groupUserName.equalsIgnoreCase("")) {

			query.append(" WHERE (codUser = usuCodigo OR 'ADMINISTRADOR GENERAL' = ? OR 'SUPER USUARIO' = ? "
					+ " OR codUser = ? ");
			parameters.add(groupUserName);
			parameters.add(groupUserName);
			parameters.add(codeUser);

			if (groupUserName != null
					&& groupUserName.equals("ADMINISTRADOR SECRETARIA")) {
				query.append(" OR COD_AREA = ? ");
				parameters.add(areaUser);
			}
			query.append(" ) ");

			if ((Object) codeSubpro != null) {
				query.append(" AND codSub = ? ");
				parameters.add(codeSubpro);
			}
		}

		ArrayList<SedeVO> lSede = new ArrayList<SedeVO>();
		try {
			pstmt = conn.prepareStatement(query.toString());
			pstmt = setQueryParameters(pstmt, parameters);
			rst = pstmt.executeQuery();

			while (rst.next()) {
				SedeVO sede = new SedeVO();
				sede.setCode(new Long(rst.getLong("CODIGO")));
				sede.setNombre(rst.getString("NOMBRE"));
				sede.setCaracter(rst.getString("CARACTER"));
				sede.setDireccion_descriptiva(rst
						.getString("DIRECCION_DESCRIPTIVA"));
				sede.setDesde(rst.getString("DESDE_VIGENCIA"));
				sede.setHasta(rst.getString("HASTA_VIGENCIA"));
				sede.setVigencia(rst.getString("VIGENCIA"));
				sede.setCodeNucleo(new Long(rst.getLong("CODNUCLEO")));
				sede.setDescNucleo(rst.getString("DESCNUCLEO"));
				sede.setCodeSubsede(new Long(rst.getLong("SEDE_CODIGO")));
				sede.setDescripcion(rst.getString("DESCRIPCION"));
				sede.setTipo(rst.getString("TIPO"));
				sede.setDireccion_encasillada(rst
						.getString("DIRECCION_ENCASILLADA"));
				sede.setLocalizacion_cobama(rst
						.getString("LOCALIZACION_COBAMA"));
				sede.setCodeMunicipio(new Long(rst.getLong("CODMUNI")));
				sede.setDescMunicipio(rst.getString("DESCMUNI"));
				lSede.add(sede);
				sede = null;
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return lSede;
	}

	public Collection<SedeVO> findTotalSedebyUser(Long codeUser,
			Long codeSubpro, String groupUserName, Long areaUser,
			String codeSede) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		StringBuffer query = new StringBuffer("SELECT DISTINCT CODIGO, NOMBRE "
				+ " FROM VCS_BEN_SEDES ");

		List<Object> parameters = new ArrayList<Object>();

		if ((Object) codeUser != null && !groupUserName.equalsIgnoreCase("")) {
			query.append(" WHERE (codUser = usuCodigo OR 'ADMINISTRADOR GENERAL' = ? "
					+ " OR 'SUPER USUARIO' = ? OR codUser = ? ");
			parameters.add(groupUserName);
			parameters.add(groupUserName);
			parameters.add(codeUser);
			if (groupUserName != null
					&& groupUserName.equals("ADMINISTRADOR SECRETARIA")) {
				query.append(" OR COD_AREA = ? ");
				parameters.add(areaUser);
			}
			query.append(" ) ");

			if ((Object) codeSubpro != null) {
				query.append(" AND codSub = ? ");
				parameters.add(codeSubpro);
			}
		}

		ArrayList<SedeVO> lSede = new ArrayList<SedeVO>();
		try {
			pstmt = conn.prepareStatement(query.toString());
			pstmt = setQueryParameters(pstmt, parameters);
			rst = pstmt.executeQuery();

			boolean isSedeActual = false;

			while (rst.next()) {
				SedeVO sede = new SedeVO();
				sede.setCode(new Long(rst.getLong("CODIGO")));
				sede.setNombre(rst.getString("NOMBRE"));
				if (rst.getString("CODIGO").equals(codeSede)) {
					isSedeActual = true;
				}
				lSede.add(sede);
			}

			if (!isSedeActual) {
				PreparedStatement pstmt2 = null;
				ResultSet rst2 = null;

				// limpiar query
				query.delete(0, query.length());

				query.append(" SELECT CODIGO, NOMBRE FROM TCS_BEN_SEDE "
						+ " WHERE CODIGO = ? ");

				try {
					pstmt2 = conn.prepareStatement(query.toString());
					pstmt2.setString(1, codeSede);

					rst2 = pstmt2.executeQuery();

					rst2.next();

					SedeVO sede = new SedeVO();
					sede.setCode(new Long(rst2.getLong("CODIGO")));
					sede.setNombre(rst2.getString("NOMBRE"));

					lSede.add(sede);
				} catch (SQLException e) {
					throw new DAOException(e);
				} finally {
					close(rst2, pstmt2);
				}
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return lSede;
	}

	public Collection<SedeVO> findSedesAsociadas(String codeSub)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String query = "SELECT DISTINCT sede.nombre NOMBRESEDE, to_char(sede.DESDE_VIGENCIA, 'yyyy-mm-dd') DESDE, "
				+ " to_char(sede.HASTA_VIGENCIA, 'yyyy-mm-dd') HASTA, decode(sede.VIGENCIA, 'A', 'S', 'I', 'N') VIGENCIASEDE "
				+ " FROM TCS_BEN_SEDE sede, TCS_BEN_SUBPROGRAMA_SEDE subsede "
				+ " WHERE subsede.SBPR_CODIGO = ? "
				+ " AND subsede.SEDE_CODIGO = sede.CODIGO ";

		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setString(1, codeSub);
			rst = pstmt.executeQuery();

			Collection<SedeVO> sedes = new ArrayList<SedeVO>();
			while (rst.next()) {
				SedeVO sedeVO = new SedeVO();
				sedeVO.setNombre(rst.getString("NOMBRESEDE"));
				sedeVO.setDesde(rst.getString("DESDE"));
				sedeVO.setHasta(rst.getString("HASTA"));
				sedeVO.setVigencia(rst.getString("VIGENCIASEDE"));
				sedes.add(sedeVO);
			}
			return sedes;
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
	}

	public String findNameByCode(String strCodeSede) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String query = "SELECT nombre FROM TCS_BEN_SEDE WHERE codigo = ? ";

		String strName = null;
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setString(1, strCodeSede);
			rst = pstmt.executeQuery();

			if (rst.next()) {
				strName = rst.getString("nombre");
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return strName;
	}

	public Collection<UsuarioxSedeVO> findUsuarioxSede(UsuarioxSedeVO criterea)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		List<Object> parameters = new ArrayList<Object>();

		StringBuffer query = new StringBuffer(
				"SELECT usu.CODIGO codeusu, usu.NOMBRE nomusu, usu.DESCRIPCION descrip, prog.CODIGO codeprograma, "
						+ " prog.NOMBRE nomprograma, sub.CODIGO codesubprograma, sub.NOMBRE nomsubprograma, "
						+ " sede.CODIGO codesede, sede.NOMBRE nomsede, gus.descripcion descripGrupo "
						+ " FROM paoyer.tcs_usuario usu, paoyer.tcs_grupo_usuario gus,TCS_BEN_PROGRAMA prog, TCS_BEN_SUBPROGRAMA sub, "
						+ " TCS_BEN_SEDE sede, TCS_BEN_USUARIO_SEDE ususede, TCS_BEN_SUBPROGRAMA_SEDE subsede "
						+ " WHERE  ususede.SPSE_CODIGO = subsede.CODIGO AND subsede.SBPR_CODIGO = sub.CODIGO AND "
						+ " sub.PRG_CODIGO = prog.CODIGO AND subsede.SEDE_CODIGO = sede.CODIGO AND ususede.USU_CODIGO = usu.CODIGO "
						+ " AND usu.gus_codigo = gus.codigo AND sede.CODIGO = ? ");
		parameters.add(criterea.getCodeSede());

		if (criterea.getCodePrograma() != null) {
			query.append(" AND prog.CODIGO = ? ");
			parameters.add(criterea.getCodePrograma());
		}

		if (criterea.getCodeSubprograma() != null) {
			query.append(" AND sub.CODIGO = ? ");
			parameters.add(criterea.getCodeSubprograma());
		}

		ArrayList<UsuarioxSedeVO> Usuarios = new ArrayList<UsuarioxSedeVO>();
		try {
			pstmt = conn.prepareStatement(query.toString());
			pstmt = setQueryParameters(pstmt, parameters);
			rst = pstmt.executeQuery();

			while (rst.next()) {
				UsuarioxSedeVO usu = new UsuarioxSedeVO();
				usu.setNombreUsuario(rst.getString("nomusu"));
				usu.setCodeUsuario(new Long(rst.getString("codeusu")));
				usu.setNombrePrograma(rst.getString("nomprograma"));
				usu.setNombreSubprograma(rst.getString("nomsubprograma"));
				usu.setDescripcionUsuario(rst.getString("descrip"));
				usu.setDescripcionGrupoUsuario(rst.getString("descripGrupo"));
				Usuarios.add(usu);
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}

		return Usuarios;
	}

	public Collection<SedeVO> findSedes() throws DAOException {
		Statement st = null;
		ResultSet rst = null;

		String query = "SELECT codigo, upper(nombre) nombre FROM TCS_BEN_SEDE "
				+ " WHERE Fcs_Ben_Val_Vigencia(VIGENCIA, DESDE_VIGENCIA, HASTA_VIGENCIA, sysdate) = 'A' "
				+ " AND vigencia='A' ORDER BY nombre";

		ArrayList<SedeVO> lSede = new ArrayList<SedeVO>();
		try {
			st = conn.createStatement();
			rst = st.executeQuery(query);

			while (rst.next()) {
				SedeVO sede = new SedeVO();
				sede.setCode(new Long(rst.getLong("CODIGO")));
				sede.setNombre(rst.getString("NOMBRE"));
				lSede.add(sede);
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, st);
		}
		return lSede;
	}
}
